最常见的strncpy函数的缺陷,‘\0‘问题 您所在的位置:网站首页 gets_s函数会自动加/0吗 最常见的strncpy函数的缺陷,‘\0‘问题

最常见的strncpy函数的缺陷,‘\0‘问题

2023-07-28 06:12| 来源: 网络整理| 查看: 265

strncpy

想必大家经常会用到复制字符串的函数吧,有时候不经意就会用到strncpy(),我有时也有用到过,但是殊不知这个函数隐藏一些缺陷。先来了解strncpy吧 原型: char *strncpy(char *dest, const char *src, size_t n) 参数: dest – 指向用于存储复制内容的目标数组。 src – 要复制的字符串。 n – 要从源中复制的字符数。 返回值: 最终复制的字符串

易错点

ps:strncpy()不会向dest追加结束标记’\0’,这就引发了很多不合常理的问题. strncpy复制后dest如果最后一个没有’\0’,用dest的时候没有结束位置,后续对于字符串的操作可能会造成内存的非法访问. 如:printf("%s\n",dest); 这句话可能就会输出一些不是你想要的结果。 标准用法

strncpy(path, src, sizeof(path) - 1); path[sizeof(path) - 1] = '\0'; len = strlen(path);

手动的添加’\0’,避免出错。 注意: src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置n个字符。但是也并不是说dest的空间越大就越好。 http://c.biancheng.net/cpp/html/170.html这个博主有详细的举例可以看一下

建议

网上的其他博主也有发帖,可以使用strlcpy()代替strlcpy,这个函数相对于strncpy好用很多。 优点: 1、不需要手动添加’\0’.函数会复制n-1个字符,最后一个字符添加’\0’。 2、函数的返回值是strlen(src),可直接判断是否被截断。

strlcpy(path, src, sizeof(path)); len = strlen(path); if ( len >= sizeof(path) ) printf("src is truncated.");

当然还有其他的一些字符串拷贝函数,大家可以看看其他博主的。

本篇只是个人觉得自己之前没有注意到的点,欢迎大佬的指点让我进步,感谢感谢。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有